package body Matieres.Classement is

   -- Permet de comparer deux matieres selon les criteres.
   function Inferieur (X, Y : Matiere; Selon : Criteres) return Boolean is
   begin
      for J in Selon'Range loop
         case Selon (J).Un_Champ is
            when Etat =>
               case Selon (J).Un_Ordre is
                  when Croissant =>
                     if Notes.getEtat(X.Une_Note) < Notes.getEtat(Y.Une_Note) then
                        return True;
                     elsif Notes.getEtat(Y.Une_Note) < Notes.getEtat(X.Une_Note) then
                        return False;
                     end if;
                  when Decroissant =>
                     if Notes.getEtat(X.Une_Note) < Notes.getEtat(Y.Une_Note) then
                        return False;
                     elsif Notes.getEtat(Y.Une_Note) < Notes.getEtat(X.Une_Note) then
                        return True;
                     end if;
               end case;
            when Coefficient =>
               case Selon (J).Un_Ordre is
                  when Croissant =>
                     if X.Un_Coefficient < Y.Un_Coefficient then
                        return True;
                     elsif Y.Un_Coefficient < X.Un_Coefficient then
                        return False;
                     end if;
                  when Decroissant =>
                     if X.Un_Coefficient < Y.Un_Coefficient then
                        return False;
                     elsif Y.Un_Coefficient < X.Un_Coefficient then
                        return True;
                     end if;
               end case;
            when Intitule =>
               case Selon (J).Un_Ordre is
                  when Croissant =>
                     if X.Un_Intitule < Y.Un_Intitule then
                        return True;
                     elsif Y.Un_Intitule < X.Un_Intitule then
                        return False;
                     end if;
                  when Decroissant =>
                     if X.Un_Intitule < Y.Un_Intitule then
                        return False;
                     elsif Y.Un_Intitule < X.Un_Intitule then
                        return True;
                     end if;
               end case;
            when Note =>
               case Selon (J).Un_Ordre is
                  when Croissant =>
                     if Notes.getEtat(X.Une_Note) = Libre then
                        if Notes.getEtat(Y.Une_Note) = Libre then
                           null;
                        else
                           return True;
                        end if;
                     elsif Notes.getEtat(Y.Une_Note) = Libre then
                        return False;
                     elsif Notes.getValeur(X.Une_Note) < Notes.getValeur(Y.Une_Note) then
                        return True;
                     elsif Notes.getValeur(Y.Une_Note) < Notes.getValeur(X.Une_Note) then
                        return False;
                     end if;
                  when Decroissant =>
                     if Notes.getEtat(X.Une_Note) = Libre then
                        if Notes.getEtat(Y.Une_Note) = Libre then
                           null;
                        else
                           return False;
                        end if;
                     elsif Notes.getEtat(Y.Une_Note) = Libre then
                        return True;
                     elsif Notes.getValeur(X.Une_Note) < Notes.getValeur(Y.Une_Note) then
                        return False;
                     elsif Notes.getValeur(Y.Une_Note) < Notes.getValeur(X.Une_Note) then
                        return True;
                     end if;
               end case;
         end case;
      end loop;
      return False;
   end Inferieur;

end Matieres.Classement;
